/**
 * @author maple on 2019/6/9 14:06.
 * @version v1.0
 * @see 1040441325@qq.com
 * 858. 镜面反射
 * 有一个特殊的正方形房间，每面墙上都有一面镜子。除西南角以外，每个角落都放有一个接受器，编号为 0， 1，以及 2。
 * <p>
 * 正方形房间的墙壁长度为 p，一束激光从西南角射出，首先会与东墙相遇，入射点到接收器 0 的距离为 q 。
 * <p>
 * 返回光线最先遇到的接收器的编号（保证光线最终会遇到一个接收器）。
 * <p>
 *  
 * <p>
 * 示例：
 * <p>
 * 输入： p = 2, q = 1
 * 输出： 2
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/mirror-reflection
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class MirrorReflection {
    // 化简,无限延长的镜子;
    // 2  1
    //    0
    // 2  1
    //    0
    public int mirrorReflection(int p, int q) {
        while (p % 2 == 0 && q % 2 == 0) {//化简至至少一个基数,
            p /= 2;
            q /= 2;
        }
        // 保证光线最终会遇到一个接收器:即 p/q能整除
        if (p % 2 == 0)//p为偶数,q为奇数, 必然p>q,,在一个正方形内反射偶数次(左侧),入2点
            return 2;
        if (q % 2 == 0)//p为奇数,q为偶数,偶数个正方形内反射奇数次(右侧) 入0点
            return 0;
        return 1;//p,q皆为奇数,反射奇数次,奇数个正方形(右侧)入 1点
    }
}
